package com.zwh.se.collection.list;

import java.util.Stack;

/**
 * @author yexi
 * 通过紧密结构来实现的栈。
 * 栈：特点：后进后出（LIFO - last in first out）。现实中的类比有羽毛球的球筒、装水的盒子等结构。
 * 实际应用：
 * (1)在内存中,对形参、局部变量等就是放入栈中来进行操作的,其存储的区域所使用的数据结构就是按照栈结构来设计的。
 * TIPS：堆是利用完全二叉树的结构来维护一组数据的。
 * (2)网络浏览器多会将用户最近访问过的网址组织为一个栈。这样，用户每访问一个新页面，其地址就会被存放至栈顶；
 *    而用户每按下一次"后退"按钮，即可沿相反的次序访问此前刚访问过的页面。
 * (3)主流的文本编辑器也大都支持编辑操作的历史记录功能（ctrl + z：撤销，ctrl + y：恢复），用户的编辑操作被依次记录在一个栈中。
 *    一旦出现误操作，用户只需按下"撤销"按钮，即可取消最近一次操作并回到此前的编辑状态。
 */
public class StackDemo {
    public static void main(String[] args) {
        //Stack是Vector的子类
        //因此继承了其两个属性：
        //Object[] elementData : 底层的数组
        //int elementCount : 数组中的容量
        // 扩容机制也一样,是2倍
        Stack<String> stack = new Stack<>();
        stack.add("A");
        stack.add("B");
        stack.add("C");
        stack.add("D");
        System.out.println(stack);//[A, B, C, D]
        System.out.println("栈是否为空：" + stack.empty());
        System.out.println("查看栈顶的数据，但是不移除：" + stack.peek());
        System.out.println(stack);
        System.out.println("查看栈顶的数据，并且将其从栈中移除(弹出)：" + stack.pop());
        System.out.println(stack);
        //和add方法执行的功能一样，只是返回值不同，可以返回插入的元素
        String ele = stack.push("D");
        System.out.println(ele);
        System.out.println(stack);
    }
}
